题目

从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

解答

五张牌构成顺子的充分条件

  • 除大小王外,无重复
  • 除大小王外,最大值与最小值的差小于5

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
bool isStraight(vector<int>& nums) {
int minn = 14, maxn = 0, cnt[14] = {0};
for(auto n:nums){
cnt[n] ++;
if(n > 0 && cnt[n] > 1){ // 有重复非王牌,直接返回false
return false;
}
minn = n != 0 && n < minn ? n : minn; // 0不参与最小值
maxn = max(maxn, n);
}
return maxn-minn < 5;
}
}

复杂度

  • 时间复杂度 O(N):一次遍历。
  • 空间复杂度 O(1):用了一个常数大小的辅助数组来记录出现次数。